home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 330_03 / tskflg.c < prev    next >
C/C++ Source or Header  |  1990-10-10  |  3KB  |  181 lines

  1. /*
  2.    --- Version 2.2 90-10-12 10:33 ---
  3.  
  4.    TSKFLG.C - CTask - Flag handling routines.
  5.  
  6.    Public Domain Software written by
  7.       Thomas Wagner
  8.       Ferrari electronic Gmbh
  9.       Beusselstrasse 27
  10.       D-1000 Berlin 21
  11.       Germany
  12. */
  13.  
  14. #include "tsk.h"
  15. #include "tsklocal.h"
  16.  
  17.  
  18. /*
  19.    create_flag - initialises flag.
  20. */
  21.  
  22. flagptr Globalfunc create_flag (flagptr flg TN(byteptr name))
  23. {
  24. #if (TSK_DYNAMIC)
  25.    if (flg == LNULL)
  26.       {
  27.       if ((flg = tsk_palloc (sizeof (flag))) == LNULL)
  28.          return LNULL;
  29.       flg->flags = F_TEMP;
  30.       }
  31.    else
  32.       flg->flags = 0;
  33. #endif
  34.  
  35.    tsk_init_qhead (&flg->wait_set, TYP_FLAG);
  36.    tsk_init_qhead (&flg->wait_clear, TYP_FLAG);
  37.    flg->state = 0;
  38.  
  39. #if (TSK_NAMED)
  40.    tsk_add_name (&flg->name, name, TYP_FLAG, flg);
  41. #endif
  42.  
  43.    return flg;
  44. }
  45.  
  46. /*
  47.    delete_flag - kills all processes waiting for flag
  48. */
  49.  
  50. void Globalfunc delete_flag (flagptr flg)
  51. {
  52.    CRITICAL;
  53.  
  54.    CHECK_EVTPTR (flg, TYP_FLAG, "Delete Flag");
  55.  
  56.    C_ENTER;
  57.  
  58.    tsk_kill_queue (&(flg->wait_set));
  59.    tsk_kill_queue (&(flg->wait_clear));
  60.    flg->state = 0;
  61.    C_LEAVE;
  62.  
  63. #if (TSK_NAMED)
  64.    tsk_del_name (&flg->name);
  65. #endif
  66.  
  67. #if (TSK_DYNAMIC)
  68.    if (flg->flags & F_TEMP)
  69.       tsk_pfree (flg);
  70. #endif
  71. }
  72.  
  73.  
  74. /*
  75.    wait_flag_set  - Wait until flag is != 0. If flag is != 0 on
  76.                     entry, the task continues to run.
  77. */
  78.  
  79. int Globalfunc wait_flag_set (flagptr flg, dword timeout)
  80. {
  81.    CRITICAL;
  82.  
  83.    CHECK_EVTPTR (flg, TYP_FLAG, "Wait Flag Set");
  84.  
  85.    C_ENTER;
  86.    if (flg->state)
  87.       {
  88.       C_LEAVE;
  89.       return 0;
  90.       }
  91.    GLOBDATA current_task->retptr = LNULL;
  92.    tsk_wait (&flg->wait_set, timeout);
  93.    return (int)((dword)GLOBDATA current_task->retptr);
  94. }
  95.  
  96.  
  97. /*
  98.    wait_flag_clear - Wait until flag is == 0. If flag is == 0 on
  99.                      entry, the task continues to run.
  100. */
  101.  
  102. int Globalfunc wait_flag_clear (flagptr flg, dword timeout)
  103. {
  104.    CRITICAL;
  105.  
  106.    CHECK_EVTPTR (flg, TYP_FLAG, "Wait Flag Clear");
  107.  
  108.    C_ENTER;
  109.    if (!flg->state)
  110.       {
  111.       C_LEAVE;
  112.       return 0;
  113.       }
  114.  
  115.    GLOBDATA current_task->retptr = LNULL;
  116.    tsk_wait (&flg->wait_clear, timeout);
  117.    return (int)((dword)GLOBDATA current_task->retptr);
  118. }
  119.  
  120.  
  121. /*
  122.    set_flag - Set flag to 1. If there are tasks waiting for the
  123.               set state, all tasks in the queue are made eligible.
  124. */
  125.  
  126. void Globalfunc set_flag (flagptr flg)
  127. {
  128.    CRITICAL;
  129.  
  130.    CHECK_EVTPTR (flg, TYP_FLAG, "Set Flag");
  131.  
  132.    C_ENTER;
  133.    flg->state = 1;
  134.    tsk_runable_all (&flg->wait_set);
  135.    C_LEAVE;
  136. }
  137.  
  138.  
  139. /*
  140.    clear_flag - Set flag to 0. If there are tasks waiting for the
  141.                 clear state, all tasks in the queue are made eligible.
  142. */
  143.  
  144. void Globalfunc clear_flag (flagptr flg)
  145. {
  146.    CRITICAL;
  147.  
  148.    CHECK_EVTPTR (flg, TYP_FLAG, "Clear Flag");
  149.  
  150.    C_ENTER;
  151.    flg->state = 0;
  152.    tsk_runable_all (&flg->wait_clear);
  153.    C_LEAVE;
  154. }
  155.  
  156.  
  157. /*
  158.    clear_flag_wait_set - Set flag to 0, then wait for set state.
  159. */
  160.  
  161. int Globalfunc clear_flag_wait_set (flagptr flg, dword timeout)
  162. {
  163.    clear_flag (flg);
  164.    return wait_flag_set (flg, timeout);
  165. }
  166.  
  167.  
  168. /*
  169.    check_flag - return current flag state.
  170. */
  171.  
  172. int Globalfunc check_flag (flagptr flg)
  173. {
  174.    CHECK_EVTPTR (flg, TYP_FLAG, "Check Flag");
  175.  
  176.    return flg->state;
  177. }
  178.  
  179.  
  180.  
  181.